home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / GRAPHICS / TEXTVEC.ZIP / MATRIX.ASM < prev    next >
Encoding:
Assembly Source File  |  1995-11-12  |  4.4 KB  |  223 lines

  1. ;; Matrix Rotations
  2. ;; Phred/OTM     aka Alex Chalfin
  3. ;; achalfin@uceng.uc.edu
  4.  
  5. .Model Large,Pascal
  6.  
  7. Jumps   ; Have TASM resolve any out of range jumps
  8. .386    ; Enable 386 code
  9.  
  10. .Code 
  11.  
  12. Include sincos.dd   ; 512 degree 12 place fixed point sin/cos tables
  13.  
  14.  Cos_X dd ?
  15.  Cos_Y dd ?
  16.  Cos_Z dd ?
  17.  Sin_X dd ?
  18.  Sin_Y dd ?
  19.  Sin_Z dd ?
  20.  
  21.  Matrix dd ?,?,?,?,?,?,?,?,?
  22.  
  23. Public InitRotationMatrix
  24.  
  25. Proc InitRotationMatrix Uses eax,Xan:Word,Yan:Word,Zan:Word
  26.  
  27. ;  Matrix[0] := ((cz * cy) + ((sx * sz) Sar 12) * sy) Sar 12;
  28. ;  Matrix[1] := ((cy * -sz) + ((cz * sx) Sar 12) * sy) Sar 12;
  29. ;  Matrix[2] := (cx * sy) Sar 12;
  30. ;  Matrix[3] := (sz * cx) Sar 12;
  31. ;  Matrix[4] := (cz * cx) Sar 12;
  32. ;  Matrix[5] := (-sx);
  33. ;  Matrix[6] := ((-sy * cz) + ((sz * sx) Sar 12) * cy) Sar 12;
  34. ;  Matrix[7] := ((-sz * -sy) + ((cz * sx) Sar 12) * cy) Sar 12;
  35. ;  Matrix[8] := (cx * cy) Sar 12;
  36.  
  37.   Mov   bx,Xan  ; Set up XAngle variables
  38.   Add   bx,bx
  39.   Movsx eax,[CoSine + bx]
  40.   Mov   Cos_X,eax
  41.   Movsx eax,[Sine + bx]
  42.   Mov   Sin_X,eax
  43.  
  44.   Mov   bx,Yan  ; Set up YAngle variables
  45.   Add   bx,bx
  46.   Movsx eax,[CoSine + bx]
  47.   Mov   Cos_Y,eax
  48.   Movsx eax,[Sine + bx]
  49.   Mov   Sin_Y,eax
  50.  
  51.   Mov   bx,Zan ; Set up ZAngle variables
  52.   Add   bx,bx
  53.   Movsx eax,[CoSine + bx]
  54.   Mov   Cos_Z,eax
  55.   Movsx eax,[Sine + bx]
  56.   Mov   Sin_Z,eax
  57.  
  58. ; Calculate first index, Matrix[0]
  59.   Mov  eax,Cos_Z
  60.   Imul [Cos_Y]
  61.   Mov  ebx,eax
  62.   Mov  eax,Sin_X
  63.   Imul [Sin_Z]
  64.   Sar  eax,12
  65.   Imul [Sin_Y]
  66.   Add  eax,ebx
  67.   Sar  eax,12
  68.   Mov  [Matrix+0],eax
  69.  
  70. ; Second index, Matrix[1]
  71.  
  72.   Mov  eax,Cos_Y
  73.   Neg  eax
  74.   Imul [Sin_Z]
  75.   Mov  ebx,eax
  76.   Mov  eax,Cos_Z
  77.   Imul [Sin_X]
  78.   Sar  eax,12
  79.   Imul [Sin_Y]
  80.   Add  eax,ebx
  81.   Sar  eax,12
  82.   Mov  [Matrix+4],eax
  83.  
  84. ; Third index, Matrix[2]
  85.  
  86.   Mov  eax,Cos_X
  87.   Imul [Sin_Y]
  88.   Sar  eax,12
  89.   Mov  [Matrix+8],eax
  90.  
  91. ; fourth index, Matrix[3]
  92.  
  93.   Mov  eax,Sin_Z
  94.   Imul [Cos_X]
  95.   Sar  eax,12
  96.   Mov  [Matrix+12],eax
  97.  
  98. ; Matrix[4]
  99.  
  100.   Mov  eax,Cos_Z
  101.   Imul [Cos_X]
  102.   Sar  eax,12
  103.   Mov  [Matrix+16],eax
  104.  
  105. ; Matrix[5]
  106.  
  107.   Mov  eax,Sin_X
  108.   Neg  eax
  109.   Mov  [Matrix+20],eax
  110.  
  111. ; Matrix[6]
  112.  
  113.   Mov  eax,Sin_Y
  114.   Neg  eax
  115.   Imul [Cos_Z]
  116.   Mov  ebx,eax
  117.   Mov  eax,Sin_Z
  118.   Imul [Sin_X]
  119.   Sar  eax,12
  120.   Imul [Cos_Y]
  121.   Add  eax,ebx
  122.   Sar  eax,12
  123.   Mov  [Matrix+24],eax
  124.  
  125. ; Matrix[7]
  126.  
  127.   Mov  eax,Sin_Z
  128.   Imul Sin_Y
  129.   Mov  ebx,eax
  130.   Mov  eax,Cos_Z
  131.   Imul [Sin_X]
  132.   Sar  eax,12
  133.   Imul [Cos_Y]
  134.   Add  eax,ebx
  135.   Sar  eax,12
  136.   Mov  [Matrix+28],eax
  137.  
  138. ; Matrix[8]
  139.  
  140.   Mov  eax,Cos_X
  141.   Imul [Cos_Y]
  142.   Sar  eax,12
  143.   Mov  [Matrix+32],eax
  144.   Ret
  145. EndP InitRotationMatrix
  146.  
  147. CalcX Macro
  148.   Mov  ebx,fs:[si+0]
  149.   Imul ebx,[Matrix+0]
  150.   Mov  eax,fs:[si+4]
  151.   Imul [Matrix+4]
  152.   Add  ebx,eax
  153.   Mov  eax,fs:[si+8]
  154.   Imul [Matrix+8]
  155.   Add  ebx,eax
  156.   Sar  ebx,12
  157.   Mov  es:[di],ebx
  158. EndM
  159.  
  160. CalcY Macro
  161.   Mov  ebx,fs:[si+0]
  162.   Imul ebx,[Matrix+12]
  163.   Mov  eax,fs:[si+4]
  164.   Imul [Matrix+16]
  165.   Add  ebx,eax
  166.   Mov  eax,fs:[si+8]
  167.   Imul [Matrix+20]
  168.   Add  ebx,eax
  169.   Sar  ebx,12
  170.   Mov  es:[di+4],ebx
  171. EndM
  172.  
  173. CalcZ Macro
  174.   Mov  ebx,fs:[si+0]
  175.   Imul ebx,[Matrix+24]
  176.   Mov  eax,fs:[si+4]
  177.   Imul [Matrix+28]
  178.   Add  ebx,eax
  179.   Mov  eax,fs:[si+8]
  180.   Imul [Matrix+32]
  181.   Add  ebx,eax
  182.   Sar  ebx,12
  183.   Mov  es:[di+8],ebx
  184. EndM
  185.  
  186.  
  187. ;      WorldVert^[Count].x := (LocalVert^[Count].x * Matrix[0] +
  188. ;                              LocalVert^[Count].y * Matrix[3] +
  189. ;                              LocalVert^[Count].z * Matrix[6]) Sar 12;
  190. ;      WorldVert^[Count].y := (LocalVert^[Count].x * Matrix[1] +
  191. ;                              LocalVert^[Count].y * Matrix[4] +
  192. ;                              LocalVert^[Count].z * Matrix[7]) Sar 12;
  193. ;      WorldVert^[Count].z := (LocalVert^[Count].x * Matrix[2] +
  194. ;                              LocalVert^[Count].y * Matrix[5] +
  195. ;                              LocalVert^[Count].z * Matrix[8]) Sar 12;
  196.  
  197. Public Rotate
  198.  
  199. Proc Rotate Uses es fs si di,LocalCoords:DWord,WorldCoords:DWord,Num:Word,XT:DWord,YT:DWord,ZT:DWord
  200.   Lfs  si,LocalCoords
  201.   Les  di,WorldCoords
  202.   Mov  cx,Num
  203.   Jcxz @Exit
  204.  @TransformLooper:
  205.   CALCX    ; Calculate the x transformation
  206.   CALCY    ; Calculate the y transformation
  207.   CALCZ    ; Calculate the z transformation
  208.   Mov  edx,XT
  209.   Add  es:[di],edx
  210.   Mov  edx,YT
  211.   Add  es:[di+4],edx
  212.   Mov  edx,ZT
  213.   Add  es:[di+8],edx
  214.   Add  si,12
  215.   Add  di,12
  216.   Inc  bx
  217.   Dec  cx
  218.   Jnz @TransformLooper
  219.  @Exit:
  220.   Ret
  221. EndP Rotate
  222. End
  223.